// 1:下载express框架
// 引入express框架
const express = require('express')
// 2: 下载接收post请求的数据 npm i body-parser
// 引入 var bodyParser = require('body-parser')
// const bodyParser = require('body-parser')
const bodyParser = require('body-parser')
// 接收文件
const multer  = require('multer')
const upload = multer({ dest: 'uploads/' })
// 下载token秘钥(npm install jsonwebtoken)
// 
// 引入 秘钥
const jwt = require('jsonwebtoken');

const app = express()

// 用包(记住)
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
// 下载cors (解决跨域问题)
// const cors = require('cors')
// app.use(cors())
//跨域请求，*代表允许全部类型
// app.use((req, res, next) => {
//     res.setHeader("Access-Control-Allow-Origin", "*");
//     next()
// })
//设置跨域请求
app.all('*', function (req, res, next) {
  //设置请求头
  //允许所有来源访问
  res.header('Access-Control-Allow-Origin', '*')
  //用于判断request来自ajax还是传统请求
  res.header("Access-Control-Allow-Headers", " Origin, X-Requested-With, Content-Type, Accept");
  //允许访问的方式
  res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
  //修改程序信息与版本
  res.header('X-Powered-By', ' 3.2.1')
  //内容类型：如果是post请求必须指定这个属性
  res.header('Content-Type', 'application/json;charset=utf-8')
  next()
})

    

// 3,下载数据库(npm i mysql)
// 引入数据库
const mysql = require('mysql');
// 创建数据库
const db = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'root',
  database : 'backstage'
});
 
// connection.connect();// 连接数据库)(可以不写)
// mysql语句
 /* 
    增 : insert into 表名(field1,field2) values (value1,value2)
    删 : delete from 表名 where 范围
    改 : update 表名 set field1=field2 where 范围
    查 : select * from 表名 
  */
 
// connection.end(); // 关闭数据库(可以不写)
// 下载nodemon

// 登录接口
app.post('/login', (req, res) => {
    let {username,password} = req.body
    // console.log(req.body)
    let sql = `select * from login where username ='${username}'`
    db.query(sql, (error, results) => { 
        if (error) {
            res.send({
                code: 500,
                msg:"服务库连接错误"
            })
        } else {
            if(results.length==0){
                res.send({
                    code: 400,
                    msg:"用户名不存在"
                })
            } else {
                if (results[0].password == password) {
                    let content = { name: username } // 要生成token的主题信息
                    let secretOrPrivateket = 'suiyi' // 要加密的key(秘钥)
                    let token = jwt.sign(content, secretOrPrivateket, {
                        expiresIn:60*60 // 1小时过期
                    })
                    results[0].token = token // 写入token
                    let sql = `update login set token='${token}' where username='${username}'`
                    db.query(sql, (error,results) => {
                        if (error) {
                            res.send({
                                code: 500,
                                msg:"写入有误"
                            })
                        } else {
                            res.send({
                                code: 200,
                                msg: "登录成功",
                                data: results.id, // 记住登录人的id号
                                token: token,
                                user_name:req.body.username
                            })
                        }
                    })
                    
                } else {
                    res.send({
                        code: 400,
                        msg:"密码错误"
                    })
                }
            }
        }
    })
})

// 检测token(有bug,待解决)
app.post("/checkUser", (req, res) => {
    let { username, token } = req.body
    let sql = `select * from login where username='${username}' and token='${token}'`
    db.query(sql, (error, results) => {
        if (error) {
            res.send(error)
            retrun
        }
        if (results.length > 0) {
            let secretOrPrivateket = 'suiyi'
            jwt.verify(token, secretOrPrivateket, (err, decode) => {
                if (err) { // 时间失效或者伪造的token
                    res.send({
                        code: 400,
                        msg:"登录失败,请重新登录"
                    })
                } else {
                    res.send({
                        code: 200,
                        msg:"恭喜您,登录成功"
                    })
                }
            })
        }
    })
})

// 注册接口
app.post("/register", (req, res) => {
    // insert into 表名(field1,field2) value(value1,value2)
    let { username, password } = req.body
    let sql = `insert into  login (username,password) values ('${username}','${password}')`
    db.query(sql, (error,results) => {
        if (error) {
            res.send({
                code: 500,
                msg:"服务库连接错误"
            })
        } else {
            res.send({
                code:200,
                msg:"注册成功"
            })
        }
    })
})


// // 获取所有数据
app.get("/getAllData", (req, res) => {
    let sql = `select * from datalist where isDel=0`
    db.query(sql, (error, results) => {
        if (error) {
            res.send({
                code: 500,
                msg:"数据连接错误"
            })
        } else {
            res.send({
                code: 200,
                msg: "获取成功",
                data:results
            })
        }
    })
})

// 获取所有的分类
app.get("/getCategory", (req,res)=> {
    let sql = `select * from category `
    db.query(sql, (error, results) => {
        if (error) {
            res.send({
                code: 500,
                msg:"数据库查询错误"
            })
        } else {
            let has = []
            for (let i = 0; i < results.length; i++){
                
                if (has.indexOf(results[i].category) == -1) {
                    has.push(results[i].category)
                    
                }
                
            }
            res.send({
                 code: 200,
                 msg:has
            })
        }
    })
    
})

// 根据文章id获取文章
app.post("/getData", (req, res) => {
    let { id } = req.body
    // console.log(id)
    let sql = `select * from datalist where isDel = 0 and id= '${id}'`
    db.query(sql, (error, results) => {
        if (error) {
            res.send({
                code: 500,
                msg:"数据库查询错误"
            })
        } else {
            res.send({
                code: 200,
                msg: "获取成功",
                data:results
            })
        }
    })
})

// // 新增数据
app.post("/addData", (req, res) => {
    let { title, category, center } = req.body
    let sql = `INSERT INTO datalist(title,category,center) VALUES ('${title}','${category}','${center}')`
    db.query(sql, (error, results) => {
        if (error) {
            res.send({
                code: 500,
                msg:"服务器内部错误"
            })
        } else {
            res.send({
                code: 200,
                msg:"新增成功"
             })
         }
    })
})


// // 删除数据
app.post("/delDel", (req, res) => {
    let { id } = req.body
    // console.log(id)
    let sql = `update datalist set isDel= 1 where id= '${id}'`
    db.query(sql, (error, results) => {
        if (error) {
            res.send({
                code: 500,
                msg:"数据库连接错误"
            })
        } else {
            res.send({
                code:200,
                msg:"删除数据成功"
            })
        }
    })
    
})

// // 修改数据
app.post("/editData", (req, res) => {
    let { title, category, center,id } = req.body
    // console.log(req.body)
    let obj = {
        title, category, center,id
    }
    let sql = `update datalist set ? where id = ${id}`
    db.query(sql, [obj,id], (error, results) => {
        if (error) {
            res.send({
                code:500,
                msg:"数据库连接失败"
            })
        } else {
            res.send({
                code:200,
                msg:"修改数据成功"
            })
            console.log(results)
        }
    })
})


// // 获取用户信息
app.get("/getUserInfo", (req, res) => {
    let sql = `select * from userInfo`
    db.query(sql, (error, results) => {
        if (error) {
            res.send({
                code:500,
                msg:"数据库查询错误"
            })
        } else {
            res.send({
                code:200,
                msg: "获取成功",
                data:results
            })
        }
    })
})


// 修改用户信息
app.post("/editUserInfo", upload.single('userIcon'),(req, res) => {
    let { nickName, signature, gender,id } = req.body
    // let { id } = req.params

    let obj = {
        id,nickName, signature, gender
    }
   
    if (req.file != undefined ) {
        obj.userIcon = "http:127.0.0.1:4000"+req.file.fieldname
    }
    
    let sql = `update userInfo set ? where id = ${id}`
    db.query(sql, (error, results) => {
        if (error) {
            res.send({
                code: 500,
                msg:"数据库连接失败"
            })
        } else {
            res.send({
                code: 200,
                msg:"修改成功"
            })
        }
    })
})


// // 重定向(跳转到登录页)
// app.on('request', (req,res) => {
//     console.log(req.url)
//     if (req.url == '/home') {
//         // 通过响应头来实现服务端重定向
//         res.writeHead(302, {
//             'Location':'http://127.0.0.1:4000/login'
//         })
//         res.end()
//     }
// })

app.listen(4000, () => {
    console.log('http://127.0.0.1:4000')
})
